package com.crm.services;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import javax.persistence.criteria.Path;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.crm.model.jdao.IProductDAO;
import com.crm.model.jdao.IShowsettingProductDAO;
import com.crm.model.mdao.ProductMapper;
import com.crm.model.pojo.Product;
import com.crm.model.pojo.ShowsettingProduct;

@Service
public class ProductServices {

	@Autowired
	private IProductDAO prdDAO;
	@Autowired
	private ProductServices ps;
	@Autowired
	private DictionaryServices ds;
	@Autowired
	private UserServices us;
	@Autowired
	ProductMapper productMapper;
	@Autowired
	private IShowsettingProductDAO sspDAO;	
	private static int count=0;

	
	/**
	 * 新增产品信息
	 * @param product
	 * @return
	 */
	public int save(Product product) {
		Product prd=prdDAO.save(product);
		if(prd==null) {
			return 0;
		}
		return 1;		
	}
	
	/**
	 * 
	 * @param pageNumber  从哪条开始显示
	 * @param pageContent	显示的记录条数
	 * @return
	 */
	public List<Product> queryByAll(int pageNumber,int pageContent,String[] DId){
		Sort sort=Sort.by(Direction.DESC, "pId");
		Pageable pageable =PageRequest.of(pageNumber,pageContent,sort);	
		//查询条件构造
		 Specification<Product> spec=new Specification<Product>(){

			@Override
			public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
				// TODO Auto-generated method stub
				//Path<Object> state=root.get("state");
				List<Predicate> list=new ArrayList<>();
				System.out.println("ps的DId:"+DId);
					if(DId.length==0) {
						list.add(cb.equal(root.get("state").as(Integer.class), 1));
					}
					int i=0;
					for (String str : DId) {
						System.out.println("str:"+str);
						if("全部数据".equals(str)) {
							 list.add(cb.equal(root.get("state").as(Integer.class), 1));	
						}
						if("产品分类".equals(str)) {
							System.out.println("触发了产品分类数据筛选");
							 list.add(cb.equal(root.join("productclassify").get("pdcId").as(Integer.class), DId[i+1]));							
						}
						if("产品状态".equals(str)) {
							 list.add(cb.equal(root.get("pStatus").as(Integer.class), DId[i+1]));							
						}
						if("产品名称".equals(str)) {
							if("不分组".equals(DId[i+1])) {
								list.add(cb.like(root.get("pName").as(String.class),"%"+DId[i+2]+"%"));									
							}else {
								list.add(cb.like(root.get("pName").as(String.class),"%"+DId[i+1]+"%"));	
							}								
						}
						if("产品单位".equals(str)) {
							System.out.println("触发了产品状态数据筛选");
							 list.add(cb.equal(root.get("pUnit").as(Integer.class), DId[i+1]));							
						}
						i++;
					}

		        Predicate[] p = new Predicate[list.size()];
		        System.out.println("-----------------------------------------");
		        query.where(list.toArray(p));
		        return query.getRestriction();
			}
			 
		 };
		Page<Product> page =prdDAO.findAll(spec,pageable);
		System.out.println("总记录数："+page.getTotalElements());
		count=(int) page.getTotalElements();
		List<Product> list=page.getContent();
		return list;		
	}
	
	/**
	 *将list的数据转换成JsonArray的数据
	 * @return
	 */
	public JSONArray ListTransJSONArray(int pageNumber,int pageContent,String[] DId) {
		JSONArray array =new JSONArray();
		List<Product> list=ps.queryByAll(pageNumber,pageContent,DId);
		for (Product product : list) {		
			JSONObject obj = new JSONObject();
			array.add(toJSONObject1( obj,product));
	}
		return array;
	}
	
	/**
	 * 将list的数据转换成JsonArray的数据,用于页面搜索查询产品名称信息
	 * 
	 * @return
	 */
	public JSONArray ListTransJSONArray1(List<Product> list) {
		JSONArray array = new JSONArray();
		for (Product product : list) {
			// System.out.println("salesOpportunity:"+salesOpportunity);
			JSONObject obj = new JSONObject();
			obj.put("value", product.getPName());
			obj.put("label1", product.getPId());
			array.add(obj);
		}
		return array;
	}
	
	/**
	 * 产品信息转JSONObject
	 * @param obj
	 * @param product
	 * @return
	 */
	public JSONObject toJSONObject1(JSONObject obj,Product product) {
		obj.put("pId", product.getPId());
		obj.put("pName", product.getPName());
		obj.put("pImg",product.getPImg());
		if(null!= product.getProductclassify()) {
			obj.put("pdcId", product.getProductclassify().getPdcName());			
		}else {
			obj.put("pdcId", "");			
		}

		obj.put("pPrice", product.getPPrice());
		obj.put("pUnit", ds.findByDictId(product.getPUnit()));
		obj.put("pStatus", product.getPStatus());
		obj.put("pStatus", ds.findByDictId(product.getPStatus())+"");
		obj.put("pCost", product.getPCost());
		return obj;
	}
	
	/**
	 * 产品信息转JSONObject,单一
	 * @param obj
	 * @param product
	 * @return
	 */
	public JSONObject toJSONObject2(JSONObject obj,Product product) {
		obj.put("pId", product.getPId());
		obj.put("pName", product.getPName());
		obj.put("pImg",product.getPImg());
		if(null!= product.getProductclassify()) {
			obj.put("pdcId", product.getProductclassify().getPdcName());			
		}else {
			obj.put("pdcId", "");			
		}
		obj.put("pPrice", product.getPPrice());
		obj.put("pUnit", ds.findByDictId(product.getPUnit()));
		obj.put("pStatus", product.getPStatus());
		obj.put("pCost", product.getPCost());
		return obj;
	}
	/**
	 * 统计对象个数
	 * @return
	 */
	public int queryByCount() {
		return count;
	}
	
	/**
	 * 根据id查询产品信息
	 * @param pId
	 * @return
	 */
	public  JSONObject findByPId(Integer pId) {
		Product product=prdDAO.findByPId(pId);
		JSONObject obj = new JSONObject();	
		return toJSONObject2(obj,product);
		  
	  }
	
	/**
	 * 删除单个产品信息
	 * @param pId
	 */
	public void Delete(Integer pId) {
		Product prd=prdDAO.findById(pId).get();
		prd.setState(0);
		prdDAO.save(prd);	
	}
	
	/**
	 * 确认产品名称是否重复
	 * @param salTheme
	 * @return 
	 */
	public Integer findByPName(String pName) {
		Product product=prdDAO.findByPName(pName);
		if(product!=null) {
			return product.getPId();
		}
		return 0;
	}
	
	/**
	 * 查询前台页面的显示字段
	 * @return
	 */
	public JSONObject showProductSetting(int userID) {
		ShowsettingProduct ssp=sspDAO.findByUserId(userID);
		JSONObject obj=new JSONObject();
		return toJSONbject3(obj,ssp);		
	}
	
	/**
	 * 
	 * @param info
	 */
	public void saveInfo(String[] info) {
		ShowsettingProduct ssp=new ShowsettingProduct();
		/*setId:-1,
		showSoltId:0,//这里设置字段是否显示
		showpPcId:0,
		showpPrice:0,
		showpUnit:0,
		showpCost:0,
		showpStatus:0,
		showpRemarks:0,*/
		 
		//ssp.setPName(splitString(info,0));		
		ssp.setPcId(splitString(info,0));
		ssp.setPPrice(splitString(info,1));
		ssp.setPUnit(splitString(info,2));		
		ssp.setPCost(splitString(info,3));
		ssp.setPStatus(splitString(info,4));
		ssp.setPRemarks(splitString(info,5));
		ssp.setUserId(splitString(info,6));						
		ssp.setSetId(splitString(info,7));
		System.out.println("设置编号:"+ssp.getSetId());
		System.out.println("看看是否添加成功:"+sspDAO.save(ssp));
	}
	
	/**
	 * 分割string数组中的数组，并转换成Integer类型
	 * @param str
	 * @param i
	 * @return
	 */
	private int splitString(String[] str,int i) {
		return Integer.valueOf(str[i].split(":")[1]);
	}
	/**
	 * 这里处理前台数据显示的转JSONbject方法
	 * @param obj
	 * @return
	 */
	private JSONObject toJSONbject3(JSONObject obj,ShowsettingProduct ssp) {
		/*
		 * p_id                 numeric(8,0) not null comment '产品id',
		   pc_id                numeric(8,0) comment '产品分类id',
		   p_name               varchar(50) not null comment '产品名称',
		   p_status             int not null comment '产品状态，正常或停售',
		   p_unit               varchar(20) comment '产品单位',
		   p_price              decimal(10,2) comment '产品价格',
		   p_cost               decimal(10,2) comment '产品成本',
		   p_img                varchar(50) comment '产品图片',
		   p_remarks            text comment '产品备注',
		 */
		if(null==ssp) {
			obj.put("showPc_id", 1);		
			//obj.put("showp_name", 1);
			obj.put("showp_status",1);
			obj.put("showp_unit", 1);
			obj.put("showp_price", 1);	
			obj.put("showp_cost", 1);
			obj.put("showp_img",1);
			obj.put("showp_remarks",0);
		}else {
			//obj.put("showSoltId", sss.);
			obj.put("setId",ssp.getSetId());
			obj.put("showPc_id", ssp.getPcId());
			//obj.put("showp_name", ssp.getPName());
			obj.put("showp_status", ssp.getPStatus());
			obj.put("showp_unit", ssp.getPUnit());
			obj.put("showp_price", ssp.getPPrice());
			obj.put("showp_cost", ssp.getPCost());
			obj.put("showp_img", ssp.getPImg());
			obj.put("showp_remarks", ssp.getPRemarks());
		}
		return obj;
		
	}
	
	/**
	 * 根据id查询产品返回对象（别删了，有用）
	 * @return 
	 * 
	 */
	public Product findOrderItemToPrd(Integer pid) {
		return prdDAO.findById(pid).get();
	}
	
	/**
	 * 查询所有产品（维修工单）
	 */
	public List<Map<String, String>> selectAllProduce() {
		return productMapper.productAllPage();
	}
	
	/**
	 * 模糊查询
	 */
	public List<Map<String,String>> productAllTable(String search){
		return productMapper.productAllTable(search);
	}
	
	
	
}
